package xmlele

import (
	

	
	
	
)

//XMLEle is an implementation of XPRes for XML elements
type XMLEle struct {
	xml.StartElement
	tree.NSBuilder
	Attrs    []tree.Node
	Children []tree.Node
	Parent   tree.Elem
	tree.NodePos
	tree.NodeType
}

//Root is the default root node builder for xmltree.ParseXML
func () xmlbuilder.XMLBuilder {
	return &XMLEle{NodeType: tree.NtRoot}
}

//CreateNode is an implementation of xmlbuilder.XMLBuilder.  It appends the node
//specified in opts and returns the child if it is an element.  Otherwise, it returns x.
func ( *XMLEle) ( *xmlbuilder.BuilderOpts) xmlbuilder.XMLBuilder {
	if .NodeType == tree.NtElem {
		 := &XMLEle{
			StartElement: .Tok.(xml.StartElement),
			NSBuilder:    tree.NSBuilder{NS: .NS},
			Attrs:        make([]tree.Node, len(.Attrs)),
			Parent:       ,
			NodePos:      tree.NodePos(.NodePos),
			NodeType:     .NodeType,
		}
		for  := range .Attrs {
			.Attrs[] = xmlnode.XMLNode{
				Token:    .Attrs[],
				NodePos:  tree.NodePos(.AttrStartPos + ),
				NodeType: tree.NtAttr,
				Parent:   ,
			}
		}
		.Children = append(.Children, )
		return 
	}

	 := xmlnode.XMLNode{
		Token:    .Tok,
		NodePos:  tree.NodePos(.NodePos),
		NodeType: .NodeType,
		Parent:   ,
	}
	.Children = append(.Children, )
	return 
}

//EndElem is an implementation of xmlbuilder.XMLBuilder.  It returns x's parent.
func ( *XMLEle) () xmlbuilder.XMLBuilder {
	return .Parent.(*XMLEle)
}

//GetToken returns the xml.Token representation of the node
func ( *XMLEle) () xml.Token {
	return .StartElement
}

//GetParent returns the parent node, or itself if it's the root
func ( *XMLEle) () tree.Elem {
	return .Parent
}

//GetChildren returns all child nodes of the element
func ( *XMLEle) () []tree.Node {
	 := make([]tree.Node, len(.Children))

	for  := range .Children {
		[] = .Children[]
	}

	return 
}

//GetAttrs returns all attributes of the element
func ( *XMLEle) () []tree.Node {
	 := make([]tree.Node, len(.Attrs))
	for  := range .Attrs {
		[] = .Attrs[]
	}
	return 
}

//ResValue returns the string value of the element and children
func ( *XMLEle) () string {
	 := ""
	for  := range .Children {
		switch .Children[].GetNodeType() {
		case tree.NtChd, tree.NtElem, tree.NtRoot:
			 += .Children[].ResValue()
		}
	}
	return 
}